home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / Pascal / Applications / TCPExample / PNL Libraries / MyUtils.p < prev    next >
Text File  |  1997-06-06  |  15KB  |  630 lines

  1. unit MyUtils;
  2.  
  3. interface
  4.  
  5.     uses
  6.         Quickdraw, Types, TextUtils, Events, Windows, MyTypes;
  7.         
  8.     const
  9.         my_font_strh_id = 1900;
  10.     
  11.     type
  12.         SavedWindowInfo = record
  13.                 oldport: GrafPtr;
  14.                 thisport: GrafPtr;
  15.                 font: integer;
  16.                 size: integer;
  17.                 face: Style;
  18.             end;
  19.  
  20.     type
  21.         MyFontType = (
  22.                 MFT_Geneva0, MFT_Geneva9, MFT_Geneva12, 
  23.                 MFT_Courier0, MFT_Courier9, MFT_Courier12,
  24.                 MFT_Chicago0, MFT_Chicago9, MFT_Chicago12,
  25.                 MFT_System0, MFT_System9, MFT_System12,
  26.                 MFT_Monaco0, MFT_Monaco9, MFT_Monaco12
  27.                 );
  28.  
  29.     procedure GetIndFont( resid: integer; index: integer; var font, size:integer);
  30.     procedure GetMyFonts(ft:MyFontType; var font, size:integer);
  31.     procedure SetMyFont(ft:MyFontType);
  32.     function MyTrapAvailable (tNumber: INTEGER): BOOLEAN;
  33.     function MyNumToString (n: longint): Str255;
  34.     function NumToK(n:longint; extra:boolean):Str255;
  35.     function NumToJustK(n: longint): Str255;
  36.     function NumToStr (n: longint): Str15;
  37.     function SafeNumToStr( n: longint ): Str15; { interrupt safe }
  38.     function SafeStrToNum( const s: string; var n: longint ): boolean; { interrupt safe }
  39.     function UNumToStr( n: longint ): Str15;
  40.     function NN (n: longint; len: integer): Str15;
  41.     function N2 (n: longint): Str15;
  42.     function HexN (n: longint): Char;
  43.     function HexN2 (n: longint): Str15;
  44.     function HexNN (n: longint; len: integer): Str15;
  45.     function HexToNum (s: Str15): longint;
  46.     function StrToNum (s: Str255): longint;
  47.     procedure DotDotDot (var s: Str255; var width: integer);
  48.     function CountSICN( typ: OSType; id: integer ): integer;
  49.     procedure PlotSICN (typ:OSType; id, index, v, h: integer);
  50.     function LookupStrH (id: integer; match: Str255): Str255;
  51.     function LookupStrhNumber (id: integer; n: longint): Str255;
  52.     function DirtyKey (ch: char): boolean;
  53.     function SendCharToIsDialogEvent (const er: EventRecord; cs: CharSet): boolean;
  54.     function GetVersionFromResFile: longint;
  55.     procedure MySetTrapAddress (addr: UniversalProcPtr; trapword: integer);
  56.     function MyGetTrapAddress (trapword: integer): UniversalProcPtr;
  57.     procedure SafeDeviceLoop (drawingRgn: RgnHandle; drawingProc: DeviceLoopDrawingUPP; userData: univ longint; flags: DeviceLoopFlags);
  58.     procedure SafeDeviceLoopRect (drawingRect: Rect; drawingProc: DeviceLoopDrawingUPP; userData: univ longint; flags: DeviceLoopFlags);
  59. { procedure drawingProc (depth: integer; deviceFlags: integer; targetDevice: GDHandle; item: longint); }
  60.     procedure MakeRGBColor (red, green, blue: UInt16; var col: RGBColor);
  61.     function IsExtension (const name, ext: Str255): boolean;
  62.     function IsPrefix (const name, prefix: Str255): boolean;
  63. {    function TPbtst(value:longint; bit:integer):Boolean;}
  64.     procedure SetInvertHiliteMode;
  65.     procedure HiliteInvertRect (r: Rect);
  66.     procedure HiliteInvertRgn (r: RgnHandle);
  67.     procedure FixScrap;
  68.     procedure HaveResources;
  69.     function MapErr( err: OSStatus ) : OSErr;
  70.     function RandBelow( n: longint ): longint;
  71.     function RandBetween( a, b: longint ): longint;
  72.     procedure AddOSErr( var err: OSErr; err2: OSErr );
  73.     procedure AddOSStatus( var err: OSStatus; err2: OSStatus );
  74.     procedure DrawCenteredString( h, v: integer; const s: string );
  75.  
  76. implementation
  77.  
  78.     uses
  79.         Scrap, SegLoad, QuickdrawText, OSUtils, Packages, ToolUtils, Resources, 
  80.         Memory, Processes, Folders, Traps, Fonts,
  81.         MyStrings, MyEvents, MyAssertions, MyMemory;
  82.  
  83.     const
  84.         HiliteMode = $938;
  85.  
  86.     procedure SetInvertHiliteMode;
  87.     begin
  88.         BitClr(POINTER(HiliteMode), pHiliteBit);
  89.     end;
  90.     
  91.     procedure HiliteInvertRect (r: Rect);
  92.     begin
  93.         SetInvertHiliteMode;
  94.         InvertRect(r);
  95.     end;
  96.  
  97.     procedure HiliteInvertRgn (r: RgnHandle);
  98.     begin
  99.         SetInvertHiliteMode;
  100.         InvertRgn(r);
  101.     end;
  102. {
  103.     function TPbtst(value:longint; bit:integer):Boolean;
  104.     begin
  105.         TPbtst := btst(value, bit);
  106.     end;
  107. }    
  108.     procedure GetIndFont( resid: integer; index: integer; var font, size:integer);
  109.         var
  110.             s:Str255;
  111.             n:longint;
  112.     begin
  113.         GetIndString( s, resid, index );
  114.         Assert( s <> '' );
  115.         GetFNum( s, font );
  116.         GetIndString( s, resid, index + 1 );
  117.         Assert( s <> '' );
  118.         StringToNum( s, n );
  119.         size := n;
  120.     end;
  121.     
  122.     procedure GetMyFonts(ft:MyFontType; var font, size:integer);
  123.     begin
  124.         GetIndFont( my_font_strh_id, 2*ord(ft) + 1, font, size );
  125.     end;
  126.     
  127.     procedure SetMyFont(ft:MyFontType);
  128.         var
  129.             font, size:integer;
  130.     begin
  131.         GetMyFonts(ft, font, size);
  132.         TextFont(font);
  133.         TextSize(size);
  134.     end;
  135.     
  136.     function IsExtension (const name, ext: Str255): boolean;
  137.         var
  138.             pn, pe: integer;
  139.     begin
  140.         if false then begin
  141.             IsExtension := IUEqualString(TPcopy(name, length(name) - length(ext) + 1, 255), ext) = 0;
  142.         end else begin
  143.             IsExtension := false;
  144.             if length(name) >= length(ext) then begin
  145.                 pn := length(name) - length(ext) + 1;
  146.                 pe := 1;
  147.                 while pe <= length(ext) do begin
  148.                     if UpCaseChar(name[pn]) <> UpCaseChar(ext[pe]) then begin
  149.                         leave;
  150.                     end;
  151.                     pn := pn + 1;
  152.                     pe := pe + 1;
  153.                 end;
  154.                 IsExtension := pe > length(ext);
  155.             end;
  156.         end;
  157.     end;
  158.  
  159.     function IsPrefix (const name, prefix: Str255): boolean;
  160.     begin
  161.         IsPrefix := IUEqualString(TPcopy(name, 1, length(prefix)), prefix) = 0;
  162.     end;
  163.     
  164.     procedure MakeRGBColor (red, green, blue: UInt16; var col: RGBColor);
  165.     begin
  166.         col.red := red;
  167.         col.green := green;
  168.         col.blue := blue;
  169.     end;
  170.  
  171.     procedure SafeDeviceLoop (drawingRgn: RgnHandle; drawingProc: DeviceLoopDrawingUPP; userData: univ longint; flags: DeviceLoopFlags);
  172.     begin
  173.         Assert( drawingProc <> nil );
  174.         if MyTrapAvailable(_DeviceLoop) then begin
  175.             DeviceLoop(drawingRgn, drawingProc, userData, flags);
  176.         end else begin
  177.             CallDeviceLoopDrawingProc(1, 0, nil, userData, drawingProc);
  178.         end;
  179.     end;
  180.  
  181.     procedure SafeDeviceLoopRect (drawingRect: Rect; drawingProc: DeviceLoopDrawingUPP; userData: univ longint; flags: DeviceLoopFlags);
  182.         var
  183.             rgn: RgnHandle;
  184.     begin
  185.         rgn := NewRgn;
  186.         RectRgn(rgn, drawingRect);
  187.         SafeDeviceLoop(rgn, drawingProc, userData, flags);
  188.         DisposeRgn(rgn);
  189.     end;
  190.  
  191.     function GetVersionFromResFile: longint;
  192.         var
  193.             versh: VersRecHndl;
  194.     begin
  195.         GetVersionFromResFile := 0;
  196.         versh := VersRecHndl(Get1Resource('vers', 1));
  197.         if versh <> nil then begin
  198.             GetVersionFromResFile := longint(versh^^.numericVersion);
  199.         end; (* if *)
  200.     end;
  201.  
  202.     function MyTrapAvailable (tNumber: INTEGER): BOOLEAN;
  203. {Check to see if a given trap is implemented. Babble as taken from IM6 }
  204.         const
  205.             TrapMask = $0800;
  206.         var
  207.             tType: TrapType;
  208.             numtraps: integer;
  209.     begin
  210.         tType := TrapType(btst(tNumber, 11));
  211.         if (tType = ToolTrap) then begin
  212.             if NGetTrapAddress($A86E, ToolTrap) = NGetTrapAddress($AA6E, ToolTrap) then begin
  213.                 numtraps := $0200;
  214.             end else begin
  215.                 numtraps := $0400;
  216.             end;
  217.             if BAND(tNumber, $07FF) >= numtraps then begin
  218.                 tNumber := _Unimplemented;
  219.             end;
  220.         end;
  221.         MyTrapAvailable := MyGetTrapAddress(tNumber) <> MyGetTrapAddress(_Unimplemented);
  222.     end;
  223.  
  224.     function MyNumToString (n: longint): Str255;
  225.         var
  226.             s, t: Str255;
  227.     begin
  228.         if abs(n) < 4096 then begin
  229.             NumToString(n, s)
  230.         end else if abs(n) < 4194304 then begin
  231.             NumToString(n div 1024, s);
  232.             GetIndString(t, 935, 2);
  233.             s := Concat(s, t);
  234.         end else begin
  235.             GetIndString(t, 935, 3);
  236.             NumToString(n div 1048576, s);
  237.             s := Concat(s, t);
  238.         end;
  239.         MyNumToString := s;
  240.     end;
  241.  
  242.     function NumToJustK(n: longint): Str255;
  243.         var
  244.             t: Str255;
  245.     begin
  246.         GetIndString(t, 935, 2);
  247.         NumToJustK := concat(NumToStr((n + 1023) div 1024), t);
  248.     end;
  249.  
  250.     function NumToK(n:longint; extra:boolean):Str255;
  251.         const
  252.             K = 1024;
  253.             M = 1048576;
  254.         var
  255.             f:integer;
  256.             s, dot:Str255;
  257.     begin
  258.         if (n < 1048576) & extra then begin
  259.             n := n*1024;
  260.             extra := false;
  261.         end;
  262.         if (n < K) then begin 
  263.             { extra is false }
  264.             NumToString(n,s);
  265.         end else begin
  266.             { n >= K }
  267.             f := ord(extra);
  268.             while n >= M do begin
  269.                 f := f + 1;
  270.                 n := n div K;
  271.             end;
  272.             { K <= n < M } { Display n/1024 GetIndStr(935,f+2) }
  273.             GetIndString(s, 935, f+2);
  274.             GetIndString(dot, 935, 1);
  275.             if n>=1024000 then begin
  276.                 n := n div 1024;
  277.                 s := concat(NumToStr(n),s);
  278.             end else if n>=102400 then begin
  279.                 n:= n*10 div 1024;
  280.                 s := concat(NumToStr(n div 10),dot,NN(n mod 10,1),s);
  281.             end else if n>=10240 then begin
  282.                 n:= n*100 div 1024;
  283.                 s := concat(NumToStr(n div 100),dot,NN(n mod 100,2),s);
  284.             end else begin
  285.                 n := n*1000 div 1024;
  286.                 s := concat(NumToStr(n div 1000),dot,NN(n mod 1000,3),s);
  287.             end;
  288.         end;
  289.         NumToK:=s;
  290.     end;
  291.     
  292.     function NumToStr (n: longint): Str15;
  293.         var
  294.             s: Str255;
  295.     begin
  296.         NumToString(n, s);
  297.         NumToStr := s;
  298.     end;
  299.     
  300.     function UNumToStr( n: longint ): Str15;
  301.         var
  302.             s: Str15;
  303.     begin
  304.         s := chr(48 + (n mod 10 + 10 + (6 * ord(n < 0))) mod 10);
  305.         n := BAND(BSR(n, 1), $7FFFFFFF) div 5;
  306.         while n <> 0 do begin
  307.             s := chr( n mod 10 + 48 ) + s;
  308.             n := n div 10;
  309.         end;
  310.         UNumToStr := s;
  311.     end;
  312.     
  313.     function SafeNumToStr( n: longint ): Str15;
  314.         var
  315.             s: Str15;
  316.             negative: boolean;
  317.     begin
  318.         if n = $8000000 then begin
  319.             SafeNumToStr := '-2147483648';
  320.         end else begin
  321.             negative := n < 0;
  322.             n := abs(n);
  323.             s := '';
  324.             repeat
  325.                 s := chr( n mod 10 + 48 ) + s;
  326.                 n := n div 10;
  327.             until n = 0;
  328.             if negative then begin
  329.                 s := '-' + s;
  330.             end;
  331.         end;
  332.         SafeNumToStr := s;
  333.     end;
  334.     
  335.     function SafeStrToNum( const s: string; var n: longint ): boolean;
  336.         var
  337.             negative: boolean;
  338.             i: longint;
  339.     begin
  340.         SafeStrToNum := false;
  341.         negative := false;
  342.         n := 0;
  343.         i := 1;
  344.         if (i <= length(s)) & (s[i] = '-') then begin
  345.             negative := true;
  346.             Inc(i);
  347.         end;
  348.         if i <= length(s) then begin
  349.             SafeStrToNum := true;
  350.             while i <= length(s) do begin
  351.                 if s[i] in ['0'..'9'] then begin
  352.                     n := n * 10 + ord(s[i]) - 48;
  353.                 end else begin
  354.                     SafeStrToNum := false;
  355.                     leave;
  356.                 end;
  357.                 Inc(i);
  358.             end;
  359.         end;
  360.         if negative then begin
  361.             n := -n;
  362.         end;
  363.     end;
  364.     
  365.     function NN (n: longint; len: integer): Str15;
  366.         var
  367.             s: Str255;
  368.     begin
  369.         if len > 15 then begin
  370.             len := 15;
  371.         end;
  372.         NumToString(n, s);
  373.         while length(s) < len do begin
  374.             s := concat('0', s);
  375.         end;
  376.         NN := s;
  377.     end;
  378.  
  379.     function N2 (n: longint): Str15;
  380.     begin
  381.         N2 := NN(n, 2);
  382.     end;
  383.  
  384.     function HexN (n: longint): Char;
  385.     begin
  386.         n := BAND(n, $000F);
  387.         if n >= 10 then begin
  388.             n := n + 7;
  389.         end;
  390.         n := n + 48;
  391.         HexN := Chr(n);
  392.     end;
  393.  
  394.     function HexN2 (n: longint): Str15;
  395.     begin
  396.         HexN2 := concat(HexN(BSR(n, 4)), HexN(n));
  397.     end;
  398.  
  399.     function HexNN (n: longint; len: integer): Str15;
  400.         var
  401.             s: Str15;
  402.     begin
  403.         if len > 15 then begin
  404.             len := 15;
  405.         end;
  406.         s := HexN(n);
  407.         while length(s) < len do begin
  408.             n := BAND(BSR(n, 4), $0FFFFFFF);
  409.             s :=concat(HexN(n), s);
  410.         end;
  411.         HexNN := s;
  412.     end;
  413.  
  414.     function HexToNum (s: Str15): longint;
  415.         var
  416.             n: longint;
  417.             i, v: integer;
  418.     begin
  419.         i := 1;
  420.         n := 0;
  421.         while (i <= length(s)) & (s[i] in ['A'..'Z', 'a'..'z', '0'..'9']) do begin
  422.             case s[i] of
  423.                 'A'..'Z': 
  424.                     v := ord(s[i]) - 55;
  425.                 'a'..'z': 
  426.                     v := ord(s[i]) - 87;
  427.                 '0'..'9': 
  428.                     v := ord(s[i]) - 48;
  429.             end;
  430.             n := BSL(n, 4) + v;
  431.             i := i + 1;
  432.         end;
  433.         HexToNum := n;
  434.     end;
  435.  
  436.     function StrToNum (s: Str255): longint;
  437.         var
  438.             n: longint;
  439.     begin
  440.         StringToNum(s, n);
  441.         StrToNum := n;
  442.     end;
  443.  
  444.     procedure DotDotDot (var s: Str255; var width: integer);
  445.         var
  446.             maxwidth, len: integer;
  447.     begin
  448.         maxwidth := width;
  449.         width := StringWidth(s);
  450.         if width > maxwidth then begin
  451.             width := width + CharWidth('…');
  452. {$PUSH}
  453. {$R-}
  454.             len := ord(s[0]);
  455.             while (len > 0) and (width > maxwidth) do begin
  456.                 width := width - CharWidth(s[len]);
  457.                 len := len - 1;
  458.             end;
  459.             len := len + 1;
  460.             s[0] := chr(len);
  461.             s[len] := '…';
  462. {$POP}
  463.         end;
  464.     end;
  465.  
  466.     function CountSICN( typ: OSType; id: integer ): integer;
  467.         var
  468.             sh: Handle;
  469.     begin
  470.         sh := GetResource( typ, id );
  471.         if sh = nil then begin
  472.             CountSICN := 0;
  473.         end else begin
  474.             CountSICN := MGetHandleSize( sh ) div 32;
  475.         end;
  476.     end;
  477.     
  478.     procedure PlotSICN (typ:OSType; id, index, v, h: integer);
  479.         var
  480.             sh: Handle;
  481.             bm: BitMap;
  482.             r: Rect;
  483.             gp: GrafPtr;
  484.     begin
  485.         sh := GetResource(typ, id);
  486.         Assert( sh <> nil );
  487.         if sh <> nil then begin
  488.             HLock(sh);
  489.             bm.baseAddr := Ptr(longint(sh^) + (index - 1) * 32);
  490.             bm.rowBytes := 2;
  491.             SetRect(r, h, v, h + 16, v + 16);
  492.             bm.bounds := r;
  493.             GetPort(gp);
  494.             CopyBits(bm, gp^.portBits, r, r, srcCopy, nil);
  495.             HUnlock(sh);
  496.             HPurge(sh);
  497.         end;
  498.     end;
  499.  
  500.     function LookupStrH (id: integer; match: Str255): Str255;
  501.         var
  502.             t, s: Str255;
  503.             i: integer;
  504.     begin
  505.         t := '';
  506.         i := 1;
  507.         repeat
  508.             GetIndString(s, id, i);
  509.             if s = match then begin
  510.                 GetIndString(t, id, i + 1);
  511.                 leave;
  512.             end;
  513.             i := i + 2;
  514.         until s = '';
  515.         LookupStrH := t;
  516.     end;
  517.  
  518.     function LookupStrhNumber (id: integer; n: longint): Str255;
  519.         var
  520.             s, t: Str255;
  521.     begin
  522.         NumToString(n, s);
  523.         t := LookupStrH(id, s);
  524.         if t = '' then begin
  525.             t := s;
  526.         end;
  527.         LookupStrhNumber := t;
  528.     end;
  529.  
  530.     function DirtyKey (ch: char): boolean;
  531.     begin
  532.         DirtyKey := not (ord(ch) in [homeChar, endChar, helpChar, pageUpChar, pageDownChar, leftArrowChar, rightArrowChar, upArrowChar, downArrowChar]);
  533.     end;
  534.  
  535.     function SendCharToIsDialogEvent (const er: EventRecord; cs: CharSet): boolean;
  536.         var
  537.             ch: char;
  538.     begin
  539.         SendCharToIsDialogEvent := true;
  540.         if EventIsKeyDown( er ) & not EventHasCommandKey( er ) then begin
  541.             ch := EventChar( er );
  542.             if not (ch in (cs + [tab, del, bs])) & DirtyKey(ch) then begin
  543.                 SendCharToIsDialogEvent := false;
  544.             end;
  545.         end;
  546.     end;
  547.  
  548.     function MyGetTrapAddress (trapword: integer): UniversalProcPtr;
  549.     begin
  550.         MyGetTrapAddress := UniversalProcPtr(NGetTrapAddress(trapword, TrapType(btst(trapword, 11))));
  551.     end;
  552.  
  553.     procedure MySetTrapAddress (addr: UniversalProcPtr; trapword: integer);
  554.     begin
  555.         NSetTrapAddress(addr, trapword, TrapType(btst(trapword, 11)));
  556.     end;
  557.  
  558.     procedure FixScrap;
  559.         var
  560.             scrap: ScrapStuffPtr;
  561.             junk, offset: longint;
  562.     begin
  563.         scrap := InfoScrap;
  564.         if scrap^.scrapHandle = nil then begin
  565.             scrap^.scrapState := -1;
  566.         end;
  567.         junk := GetScrap(nil, 'XXXX', offset);
  568.         junk := UnloadScrap;
  569.     end;
  570.  
  571.     procedure HaveResources;
  572.     begin
  573.         if Get1Resource('BNDL', 128) = nil then begin
  574.             SysBeep(1);
  575.             ExitToShell;
  576.         end;
  577.     end;
  578.  
  579.     function MapErr( err: OSStatus ) : OSErr;
  580.     begin
  581.         if (err < -32768) or (err > 32767) then begin
  582.             err := -32767;
  583.         end; (* if *)
  584.         MapErr := err;
  585.     end;
  586.  
  587.     function RandBelow( n: longint ): longint;
  588.         var
  589.             junk: integer;
  590.     begin
  591.         Assert( n >= 1 );
  592.         junk := Random();
  593.         RandBelow := band(qd.randSeed, $7FFFFFFF) mod n;
  594.     end;
  595.     
  596.     function RandBetween( a, b: longint ): longint;
  597.         var
  598.             result: longint;
  599.     begin
  600.         Assert( b >= a );
  601.         if b <= a then begin
  602.             result := a;
  603.         end else begin
  604.             result := RandBelow(b-a+1) + a;
  605.         end;
  606.         RandBetween := result;
  607.     end;
  608.     
  609.     procedure AddOSErr( var err: OSErr; err2: OSErr );
  610.     begin
  611.         if err = noErr then begin
  612.             err := err2;
  613.         end;
  614.     end;
  615.     
  616.     procedure AddOSStatus( var err: OSStatus; err2: OSStatus );
  617.     begin
  618.         if err = noErr then begin
  619.             err := err2;
  620.         end;
  621.     end;
  622.     
  623.     procedure DrawCenteredString( h, v: integer; const s: string );
  624.     begin
  625.         MoveTo( h - StringWidth( s ) div 2, v );
  626.         DrawString( s );
  627.     end;
  628.     
  629. end.
  630.